#include "PagoMensualModule.h"

// PagoMensualModule
extern QSqlDatabase enjoylifedb;
extern PMSqlTableModel *pm_model;
extern QTableView *pm_view;
extern QTableView *pmCliente_view;

// ClientModule
extern QSqlRelationalTableModel *client_model;
extern QTableView *client_view;

/**
 * @brief ChequesModule::ChequesModule
 * @param parent
 */
PagoMensualModule::PagoMensualModule(QWidget *parent) :
    QMainWindow(parent)
{
    pm_toolbar = new CustomModulesToolbar(this);
    UpdateClientListToolBar();
    UpdatePMListToolBar();
    addToolBar(pm_toolbar);

    pm_model = new PMSqlTableModel(this,enjoylifedb);
    pm_model->setTable("pago_mensual");
    pm_model->setEditStrategy(PMSqlTableModel::OnFieldChange);

    client_model = new PMSqlTableModel(this,enjoylifedb);
    client_model->setTable("cliente");
    client_model->setEditStrategy(PMSqlTableModel::OnFieldChange);

    QWidget* widgetModels = new QWidget();
    QVBoxLayout *layout = new QVBoxLayout;
    QSplitter *split = new QSplitter;

    pmCliente_view = new QTableView(split);
    pmCliente_view->setModel(client_model);

    pm_view = new QTableView(split);
    pm_view->setModel(pm_model);

    split->setOrientation(Qt::Horizontal);
    split->adjustSize();
    // Set the initial sizes for QSplitter widgets
    QList<int> sizes;
    sizes << 550 << 250;
    split->setSizes(sizes);

    layout->addWidget(split);

    widgetModels->setLayout(layout);
    setCentralWidget(widgetModels);

    UpdateClientList();
    CleanPMList();

    // Filtros rápidos
    QGridLayout *grid_lay = new QGridLayout();
    QGroupBox *group_father = new QGroupBox("Filtros y Búsquedas",this);
    QFormLayout *form_date = new QFormLayout;

    QLabel *date_label = new QLabel("Filtrar por Año",0);
    date_label->setFixedWidth(300);
    date_label->setFixedHeight(20);
    date_label->setAlignment(Qt::AlignCenter);
    date_label->setStyleSheet("background-color: rgb(51,204,255); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_date->addRow(date_label);

    anioPasado = new QRadioButton("El Año Pasado...",0);
    connect(anioPasado,SIGNAL(clicked()),this,SLOT(AnioPasado()));
    form_date->addRow(anioPasado);

    anioCorriente = new QRadioButton("El Año Corriente...",0);
    connect(anioCorriente,SIGNAL(clicked()),this,SLOT(AnioCorriente()));
    form_date->addRow(anioCorriente);

    QLabel *filter_label = new QLabel("Búsqueda Rápida",0);
    filter_label->setFixedWidth(300);
    filter_label->setFixedHeight(20);
    filter_label->setAlignment(Qt::AlignCenter);
    filter_label->setStyleSheet("background-color: rgb(51,204,255); font: 11pt \"Helvetica57-Condensed\";border-style: solid");
    form_date->addRow(filter_label);

    encontrar_persona = new QRadioButton("Cliente",0);
    connect(encontrar_persona,SIGNAL(clicked()),this,SLOT(EncontrarPersona()));
    form_date->addRow(encontrar_persona);

    encontrar_anio = new QRadioButton("Año",0);
    connect(encontrar_anio,SIGNAL(clicked()),this,SLOT(EncontrarAnio()));
    form_date->addRow(encontrar_anio);

    campoBusqueda = new QLineEdit(this);
    campoBusqueda->setFixedWidth(300);
    campoBusqueda->setEnabled(false);
    form_date->addRow(campoBusqueda);

    group_father->setLayout(form_date);
    group_father->setFixedWidth(320);
    grid_lay->addWidget(widgetModels,0,0);
    grid_lay->addWidget(group_father,0,1);

    QWidget* widgetGral = new QWidget();
    widgetGral->setLayout(grid_lay);
    setCentralWidget(widgetGral);

    // Doble click sobre un cheque abre la edición.
    connect(pmCliente_view,SIGNAL(clicked(QModelIndex)),this,SLOT(SeleccionarPM()));
    //    UpdateChequesListBtn();
}


/*
 * Icono: Actualizar lista de movimientos.
 */
void PagoMensualModule::UpdateClientListToolBar()
{
    accion_updateClientList = new QAction("Actualizar Lista Cheq.",this);
    accion_updateClientList->setIcon(QIcon("://Icons/BarraHerramientas/actualizar48.png"));
    accion_updateClientList->setToolTip("Actualiza la lista de clientes");
    pm_toolbar->addSeparator();
    pm_toolbar->addAction(accion_updateClientList);
    pm_toolbar->addSeparator();

    connect(accion_updateClientList,SIGNAL(triggered()),this,SLOT(UpdateClientList()));
}

/*
 * Icono: Actualizar lista de movimientos.
 */
void PagoMensualModule::UpdatePMListToolBar()
{
    accion_updatePMList = new QAction("Actualizar Lista Cheq.",this);
    accion_updatePMList->setIcon(QIcon("://Icons/BarraHerramientas/actualizar48.png"));
    accion_updatePMList->setToolTip("Actualiza la lista de pagos mensuales");
    pm_toolbar->addSeparator();
    pm_toolbar->addAction(accion_updatePMList);

    connect(accion_updatePMList,SIGNAL(triggered()),this,SLOT(CleanPMList()));
}

/**
 * @brief PagoMensualModule::CleanPMList
 */
void PagoMensualModule::CleanPMList()
{
    QString Filtro = "pm_razon_social = '  '";
    enjoylifedb.transaction();
    pm_model->setTable("pago_mensual");
    pm_model->setFilter(Filtro);
    if (!pm_model->select()) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        CorrectViewOfModelPM();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModelPM();
}

/**
 * @brief PagoMensualModule::UpdatePMList
 */
void PagoMensualModule::UpdatePMList()
{
    QDate date;
    QString format = "yyyy";
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    QString fecha = date.toString(format);

    enjoylifedb.transaction();
    filtroPM = "anio = '" + fecha + "'";
    pm_model->setTable("pago_mensual");
    pm_model->filter().clear();
    pm_model->setFilter(filtroPM);
    if (!(pm_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModelPM();
}

/**
 * @brief PagoMensualModule::CorrectViewOfModelPM
 */
void PagoMensualModule::CorrectViewOfModelPM()
{
    pm_model->setHeaderData(3,Qt::Horizontal,"Mes");
    pm_model->setHeaderData(4,Qt::Horizontal,"Monto");

    pm_view->setModel(pm_model);
    pm_view->setCornerButtonEnabled(true);
    pm_view->setAlternatingRowColors(true);
    pm_view->setGridStyle(Qt::SolidLine);
    pm_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    pm_view->setWordWrap(true);
    pm_view->horizontalHeader()->setStretchLastSection(true);
    pm_view->sortByColumn(0,Qt::AscendingOrder);
    pm_view->hideColumn(0);
    pm_view->hideColumn(1);
    pm_view->hideColumn(2);
    pm_view->hideColumn(5);

    pm_view->setColumnWidth(3,140);
    pm_view->setColumnWidth(4,110);
}

/**
 * @brief PagoMensualModule::UpdateClientList
 */
void PagoMensualModule::UpdateClientList()
{
    enjoylifedb.transaction();
    client_model->setTable("cliente");
    if (!(client_model->select())) {
        QMessageBox::critical(this,"Error!", "No se pudieron recuperar los registros, intentelo nuevamente más tarde.");
        enjoylifedb.rollback();
        return;
    }
    enjoylifedb.commit();
    CorrectViewOfModelClient();
}

/**
 * @brief PagoMensualModule::CorrectViewOfModelClient
 */
void PagoMensualModule::CorrectViewOfModelClient()
{
    client_model->setHeaderData(0,Qt::Horizontal,"ID");
    client_model->setHeaderData(1,Qt::Horizontal,"Cliente");

    pmCliente_view->setModel(client_model);
    pmCliente_view->setCornerButtonEnabled(true);
    pmCliente_view->setAlternatingRowColors(true);
    pmCliente_view->setGridStyle(Qt::SolidLine);
    pmCliente_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
    pmCliente_view->setWordWrap(true);
    pmCliente_view->horizontalHeader()->setStretchLastSection(true);
    pmCliente_view->sortByColumn(1,Qt::SortOrder());
    pmCliente_view->hideColumn(2);
    pmCliente_view->hideColumn(3);
    pmCliente_view->hideColumn(4);
    pmCliente_view->hideColumn(5);
    pmCliente_view->hideColumn(6);
    pmCliente_view->hideColumn(7);
    pmCliente_view->hideColumn(8);
    pmCliente_view->hideColumn(9);
    pmCliente_view->hideColumn(10);
    pmCliente_view->hideColumn(11);
    pmCliente_view->hideColumn(12);
    pmCliente_view->hideColumn(13);
    pmCliente_view->hideColumn(14);
    pmCliente_view->hideColumn(15);
    pmCliente_view->hideColumn(16);
    pmCliente_view->hideColumn(17);
    pmCliente_view->hideColumn(18);
    pmCliente_view->hideColumn(19);
    pmCliente_view->hideColumn(20);
    pmCliente_view->hideColumn(21);

    pmCliente_view->setColumnWidth(0,50);
    pmCliente_view->setColumnWidth(1,300);
}

/**
 * @brief PagoMensualModule::AnioPasado
 */
void PagoMensualModule::AnioPasado()
{
    campoBusqueda->setEnabled(false);
    campoBusqueda->clear();

    int selection = -1;
    if (!(pmCliente_view->currentIndex().row() == -1)) {
        selection = pmCliente_view->currentIndex().row();
    }

    QDate date;
    QString format = "yyyy";
    date.setDate(date.currentDate().year()-1, date.currentDate().month(), date.currentDate().day());
    QString anio = date.toString(format);
    cliente = client_model->index(selection,1).data().toString();
    filtroPM = "pm_razon_social = '" + cliente + "'" ;
    filtroPM = filtroPM + "and anio = '" + anio + "'";

    if (anioPasado->isChecked()) {
        if (!(selection == -1)) {
            enjoylifedb.transaction();
            pm_model->setTable("pago_mensual");
            pm_model->setFilter(filtroPM);
            if (! pm_model->select()) {
                QMessageBox::critical(this,"Error!", "No hay registros cargados para este cliente.");
                enjoylifedb.rollback();
                CorrectViewOfModelPM();
                return;
            }
            enjoylifedb.commit();
            CorrectViewOfModelPM();
        }
    }
}

/**
 * @brief PagoMensualModule::AnioCorriente
 */
void PagoMensualModule::AnioCorriente()
{
    campoBusqueda->setEnabled(false);
    campoBusqueda->clear();

    int selection = -1;
    if (!(pmCliente_view->currentIndex().row() == -1)) {
        selection = pmCliente_view->currentIndex().row();
    }

    QDate date;
    QString format = "yyyy";
    date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
    QString anio = date.toString(format);
    cliente = client_model->index(selection,1).data().toString();
    filtroPM = "pm_razon_social = '" + cliente + "'" ;
    filtroPM = filtroPM + "and anio = '" + anio + "'";

    if (anioCorriente->isChecked()) {
        if (!(selection == -1)) {
            enjoylifedb.transaction();
            pm_model->setTable("pago_mensual");
            pm_model->setFilter(filtroPM);
            if (! pm_model->select()) {
                QMessageBox::critical(this,"Error!", "No hay registros cargados para este cliente.");
                enjoylifedb.rollback();
                CorrectViewOfModelPM();
                return;
            }
            enjoylifedb.commit();
            CorrectViewOfModelPM();
        }
        else {
            QMessageBox::critical(this,"Error!", "No se seleccionó ningún cliente.");
            return;
        }
    }
}

/**
 * @brief PagoMensualModule::EncontrarPersona
 */
void PagoMensualModule::EncontrarPersona()
{
    if (encontrar_persona->isChecked()) {
        UpdateClientList();
        CleanPMList();
        encontrar_anio->setChecked(false);
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroAnio()));
        campoBusqueda->setEnabled(true);
        connect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroPersona()));
    }
    else {
        UpdateClientList();
        CleanPMList();
        campoBusqueda->setEnabled(false);
    }
}

/**
 * @brief PagoMensualModule::FiltroPersona
 */
void PagoMensualModule::FiltroPersona()
{
    CleanPMList();
    if (!campoBusqueda->text().isEmpty()) {
        enjoylifedb.transaction();
        filtroPM = "razon_social ilike '%" + campoBusqueda->text() + "%'";
        client_model->setTable("cliente");
        client_model->filter().clear();
        client_model->setFilter(filtroPM);
        if (!(client_model->select())) {
            QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
            enjoylifedb.rollback();
            UpdateClientList();
            CleanPMList();
            return;
        }
        else {
            enjoylifedb.commit();
            CorrectViewOfModelClient();
            CleanPMList();
        }
    }
    else {
        UpdateClientList();
        CleanPMList();
    }
}

/**
 * @brief PagoMensualModule::EncontrarAnio
 */
void PagoMensualModule::EncontrarAnio()
{
    if (encontrar_anio->isChecked()) {
        UpdateClientList();
        encontrar_persona->setChecked(false);
        disconnect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroPersona()));
        campoBusqueda->setEnabled(true);
        connect(campoBusqueda,SIGNAL(returnPressed()),this,SLOT(FiltroAnio()));
    }
    else {
        UpdateClientList();
        CleanPMList();
        campoBusqueda->setEnabled(false);
    }
}

/**
 * @brief PagoMensualModule::FiltroAnio
 */

void PagoMensualModule::FiltroAnio()
{
    int selection = -1;
    if (!(pmCliente_view->currentIndex().row() == -1)) {
        selection = pmCliente_view->currentIndex().row();
    }

    if (!campoBusqueda->text().isEmpty()) {
        if (!(selection == -1)) {
            enjoylifedb.transaction();
            cliente = client_model->index(selection,1).data().toString();
            anio = "anio = '" + campoBusqueda->text() + "'";
            filtroPM = "pm_razon_social = '" + cliente + "'" ;
            filtroPM = filtroPM + " and " + anio;
            pm_model->setTable("pago_mensual");
            pm_model->filter().clear();
            pm_model->setFilter(filtroPM);
            if (!(pm_model->select())) {
                QMessageBox::critical(this,"Error!", "Ningún Registro cumple con esa condición.");
                enjoylifedb.rollback();
                CorrectViewOfModelPM();
                return;
            }
            else {
                enjoylifedb.commit();
                CorrectViewOfModelPM();
            }
        }
        else {
            QMessageBox::critical(this,"Error!", "No se seleccionó ningún cliente.");
            return;
        }
    }
    else {
        UpdateClientList();
        AnioCorriente();
    }
}

/**
 * @brief PagoMensualModule::SeleccionarPMpablo pa
 */
void PagoMensualModule::SeleccionarPM()
{
    int selection = -1;
    if (!(pmCliente_view->currentIndex().row() == -1)) {
        selection = pmCliente_view->currentIndex().row();
    }

    if (!(selection == -1)) {
        enjoylifedb.transaction();

        QDate date;
        QString format = "yyyy";
        date.setDate(date.currentDate().year(), date.currentDate().month(), date.currentDate().day());
        QString anio = date.toString(format);
        cliente = client_model->index(selection,1).data().toString();
        QString filtro = "pm_razon_social = '" + cliente + "'" ;
        filtro = filtro + "and anio = '" + anio + "'";
        pm_model->setTable("pago_mensual");
        pm_model->setFilter(filtro);
        if (! pm_model->select()) {
            QMessageBox::critical(this,"Error!", "No hay registros cargados para este cliente.");
            enjoylifedb.rollback();
            CorrectViewOfModelPM();
            return;
        }
        enjoylifedb.commit();
        CorrectViewOfModelPM();
    }
}
